#ifndef QLSRULER_H
#define QLSRULER_H

#include <QWidget>

#include "qls_qss_global.h"

class QLabel;

class QLsRuler : public QWidget
{
    Q_OBJECT

    Q_ENUMS(ScaleLabelPosition)
    Q_ENUMS(RulerDirection)
    Q_ENUMS(ScaleDirection)
    Q_ENUMS(RulerType)
    Q_ENUMS(ScaleType)

public:
#if 0
    // 刻度等级
    enum ScaleLevel{
        ScaleLevel_Unit = 0,                // 刻度单位
        ScaleLevel_Label = 1,               // 刻度值
    };

    // 刻度范围
    enum ScaleRange{
        ScaleRange_All = 0,                 // 整体范围
        ScaleRange_valid = 1,               // 有效范围，可移动范围
    };
#endif

    // 刻度条文字位置
    enum ScaleLabelPosition{
        ScaleLabelPosition_Inside = 0,      // 里面
        ScaleLabelPosition_Outside = 1,     // 外面
    };

    // 标尺方向
    enum RulerDirection{
        RulerDirection_West = 0,            // 上北
        RulerDirection_North = 1,           // 右东
        RulerDirection_South = 2,           // 下南
        RulerDirection_East = 3,            // 左西
    };

    // 刻度方向
    enum ScaleDirection{
        ScaleDirection_Left_To_Right = 0,   // 从左到右
        ScaleDirection_Right_To_Left = 1,   // 从右到左
    };

    // 标尺类型
    enum RulerType{
        RulerType_Scale = 0,                // 只有刻度
        RulerType_Cursor = 1,               // 游标标尺
        RulerType_Line = 2,                 // 线性标尺
        RulerType_Progress = 3,             // 进度标尺
        RulerType_Slide = 4,                // 滑动标尺
    };

    // 刻度类型
    enum ScaleType{
        ScaleType_Value = 0,                // 根据数值绘制
        ScaleType_Number = 1,               // 根据刻度个数绘制
    };

public:
    explicit QLsRuler(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *evnet) override;
    void mouseMoveEvent(QMouseEvent *event) override;

private:
    // 更新最小尺寸
    void updateMinimumSize(QPainter *painter);

    // 进度标尺 绘制进度背景色
    void drawProgress(QPainter *painter);
    // 绘制刻度尺颜色
    void drawScaleRangeColor(QPainter *painter);
    // 绘制刻度
    void drawScale(QPainter *painter);
    // 绘制标签
    void drawLabel(QPainter *painter);
    // 线性标尺 绘制进度线条
    void drawLine(QPainter *painter);
    // 游标标尺 滑动标尺 绘制游标
    void drawCursor(QPainter *painter);

    // 获取旋转后的 总区域
    QRect getRotateRectAll(QPainter *painter);
    // 获取旋转后的 实际内容区域 默认居中
    QRect getRotateRectTrue(QPainter *painter);
    // 获取旋转后的 刻度条区域
    QRect getRotateRectScale(QPainter *painter);
    // 获取旋转后的 标签区域
    QRect getRotateRectLabel(QPainter *painter);

    // 旋转前后坐标转换
    QPointF getRotatePoint(const QPointF &p0, const QPointF &p1, double a);

private:
    // 游标提示值
    QLabel *cursor_label_;

    // 鼠标状态
    bool press_{false};
    bool is_move_triangle_{false};
    QPointF triangle_pos_;

    // 偏移坐标、旋转角度
    QPointF translate_point_;
    qreal rotate_angle_;

    // 游标
    QPolygonF triangle_{QVector<QPointF>(3, QPointF(0, 0))};

    // 内边距
    QLS_PROPERTY(padding_top_, double)
    QLS_PROPERTY(padding_right_, double)
    QLS_PROPERTY(padding_bottom_, double)
    QLS_PROPERTY(padding_left_, double)
    // 文字到刻度条的间距
    QLS_PROPERTY(scale_label_space_, double)

    // 标尺类型
    QLS_PROPERTY(ruler_type_, RulerType)

    // 标尺方向
    QLS_PROPERTY(ruler_direction_, RulerDirection)
    // 刻度方向
    QLS_PROPERTY(scale_direction_, ScaleDirection)

    // 刻度值
    QLS_PROPERTY(scale_value_, double)
    QLS_PROPERTY(scale_unit_value_, double)
    QLS_PROPERTY(scale_label_value_, double)
    // 刻度类型
    QLS_PROPERTY(scale_type_, ScaleType)

    // 刻度范围
    QLS_PROPERTY(scale_range_all_min_, double)
    QLS_PROPERTY(scale_range_all_max_, double)
    QLS_PROPERTY(scale_range_valid_enabled_, double)
    QLS_PROPERTY(scale_range_valid_min_, double)
    QLS_PROPERTY(scale_range_valid_max_, double)
    // 刻度条范围颜色
    QLS_PROPERTY(scale_range_all_color_, QBrush)
    QLS_PROPERTY(scale_range_valid_color_, QBrush)
    // 刻度条范围背景颜色
    QLS_PROPERTY(scale_range_all_bgcolor_, QBrush)
    QLS_PROPERTY(scale_range_valid_bgcolor_, QBrush)

    // 刻度条尺寸
    QLS_PROPERTY(scale_unit_size_, QSize)
    QLS_PROPERTY(scale_label_size_, QSize)
    // 刻度条厚度
    QLS_PROPERTY(scale_thickness_, double)

    // 是否显示刻度值标签
    QLS_PROPERTY(scale_label_visiable_, bool)
    // 刻度值标签位置
    QLS_PROPERTY(scale_label_position_, ScaleLabelPosition)

    // 是否显示游标
    QLS_PROPERTY(cursor_visiable_, bool)
    // 游标颜色
    QLS_PROPERTY(cursor_color_, QBrush)
    // 游标边长
    QLS_PROPERTY(cursor_side_, double)
    // 是否显示游标提示值
    QLS_PROPERTY(cursor_label_visiable_, bool)
};

#endif // QLSRULER_H
